package com.bitoon.basketdudes.web;

import com.bitoon.basketdudes.web.jpa.*;
 
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
import javax.persistence.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ServletResponseAware;

public class Login extends BaseAction implements ServletResponseAware {

    private String usuario;
    private String tcontrasenya;
    private String recordarme;
    private Logger log = Logger.getLogger(Login.class);
    private String r; // Página a la que redirigir

    private static String NO_ACTIVADO = "no_activado";

    // For access to the raw servlet request / response, eg for cookies
    protected HttpServletResponse servletResponse;
    @Override
    public void setServletResponse(HttpServletResponse servletResponse) {
        this.servletResponse = servletResponse;
    }

    public Login() {
    }

    public String getUrl() {
        String retorno = "/";
        try {
            log.debug("[redireccion] leyendo session paginaRetorno ...");
            //retorno = (String)session.get("paginaRetornoAnt"); // 13.10.2011
            retorno = (String)session.get("paginaRetorno");
            log.debug("[redireccion] leido: " + retorno);
        } catch (Exception e) {
        }

        return retorno;
    }


    @Override
    public String execute() {

        //Map<String,Object> session = ActionContext.getContext().getSession();
        int idUsuario = -1;
        EntityManager em = null;

        String retorno = REDIRECT;

        log.debug("usuario: " + usuario);
        log.debug("tcontrasenya: " + tcontrasenya);
        log.debug("r: " + r);

        if (r!=null) {
            log.debug("fijando paginaRetorno: " + r);
            if (r.equals("mis-invitaciones/")) {
                session.put("paginaRetorno", "/mi-cuenta/mis-invitaciones/");
            }
            if (r.equals("recargar-bitoons/")) {
                session.put("paginaRetorno", "/recargar-bitoons/");
            }
            if (r.equals("torneos-personalizados/")) {
                session.put("paginaRetorno", "/competicion/torneos-personalizados/accion/crear/");
            }
        }

        if ( (usuario != null) && (tcontrasenya != null) ) {

            try {
                em = emfBasket.createEntityManager(); // checked

                em.getTransaction().begin();

                Query q = em.createNamedQuery("Usuario.findByNickPassword");
                q.setParameter("nick", usuario.toLowerCase());
                q.setParameter("password", tcontrasenya);

                log.debug("nick: " + usuario.toLowerCase() + ", password: " + tcontrasenya);

                Usuario u = (Usuario)q.getSingleResult();

                log.debug("u: " + u);

                if (u != null) { // El usuario es válido
                    log.debug("status: " + u.getStatus());
                    if (u.getStatus()!=null && (u.getStatus()==1 || u.getStatus()==0)) {
                    //if (u.getStatus()!=null && (u.getStatus()==1)) {
                        // Usuario activo
                        idUsuario = u.getId();

                        // Probar las cookies para el SSO de vBulletin

                        /*
                        Cookie userIdVBulletin = new Cookie("bb_userid", Integer.toString(u.getId()));
                        userIdVBulletin.setMaxAge(60*60*24*7);
                        userIdVBulletin.setDomain(".basketdudes.com");
                        servletResponse.addCookie(userIdVBulletin);

                        Cookie userMd5VBulletin = new Cookie("bb_password", u.getPasswordMd5());
                        userMd5VBulletin.setMaxAge(60*60*24*7);
                        userMd5VBulletin.setDomain(".basketdudes.com");
                        servletResponse.addCookie(userMd5VBulletin);
                         *
                         */

                    } else {
                        // Comprobar las causas por las que no está activo el usuario
                        idUsuario = -4;
                        switch (u.getStatus()) {
                            case 0:
                                retorno = NO_ACTIVADO;

/*
 *
 * Grabar en la sesión el usuario para poder cambiar su email si decide
 * reenviar el email de activación a un email distinto
 *
 */
                                session.put("bd_userNoActivado", u);

                                //setMensajeAlerta("Necesitas activar tu cuenta. Revisa tu correo.");
                                break;
                        }
                    }

                    // Si ha puesto recordarme, crear la cookie y grabarla
                    // Pero sólo si el usuario es válido, y está activo

                    if (idUsuario > 0 && recordarme != null && recordarme.equalsIgnoreCase("on")) {
                        log.debug("Grabar cookie para recordar usuario");

                        String claveAleatoria = Registro.dameClaveActivacion();
                        log.debug("Grabar cookie " + u.getNick() + "-" + claveAleatoria);

                        Cookie reminder = new Cookie("bdrc", u.getNick() + "-" + claveAleatoria); // bdrc => BasketDudes Reminder Cookie
                        reminder.setMaxAge(60*60*24*7);
                        servletResponse.addCookie(reminder);

                        Activacion activacion = new Activacion();
                        activacion.setTipo(2); // El tipo 2 es recuerdo de contraseña/cookie
                        activacion.setHash(claveAleatoria);
                        activacion.setValor("cookie_reminder");

                        activacion.setUsuario(u);
                        em.persist(activacion);

                    }
                } else {
                    idUsuario = 0;
                    setMensajeAlerta(getText("alertas.login.error"));
                }

                log.debug("idUsuario: " + idUsuario);

                if (idUsuario > 0) { // existe el usuario
                    // Actualizar f_ultimo
                    u.setfUltimo(new Date());

                    em.persist(u);
                    
                    // Poner logado en la sesión
                    log.debug("el usuarioLogin es: " + u);
                    session.put("bd_userId", Integer.toString(idUsuario));
                    session.put("bd_userLogado", u);

                    retorno = LOGADO;

                    if (Boolean.parseBoolean(configuracionGeneral.getProperty("vbulletin_bridge_enabled"))) {
                        llamarBridgeVBulletin(u);
                    }

                    log.debug("Se devuelve logado, y la url es: " + getUrl());
                }

                em.getTransaction().commit();
            } catch (NoResultException e) {
                // El usuario no existe
                idUsuario = -3;
                setMensajeAlerta(getText("alertas.login.error"));
            } catch (Exception e) {
                log.error("[execute]: ", e);
                idUsuario = -2;
                setMensajeAlerta(getText("alertas.login.error"));
            } finally {
                try { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); }; } catch (Exception e) { }
                try { em.close(); } catch (Exception e) { }
            }

        } else {
            if (session.get("bd_userLogado") != null) {
                retorno = LOGADO;
            }
        }

        return retorno;
    }



    private void llamarBridgeVBulletin(Usuario u) {
        //StringBuilder locationBridgeVB = new StringBuilder("http://forum.basketdudes.com/btnBridge_register.php");
        StringBuilder locationBridgeVB = new StringBuilder(configuracionGeneral.getProperty("vbulletin_bridge_url"));

        try {
            HttpURLConnection huc;
            StringBuffer params = new StringBuffer();
            params.append("?c=");
            params.append(configuracionGeneral.getProperty("vbulletin_bridge_key"));
            params.append("&userid=").append(Integer.toString(u.getId()));
            params.append("&username=").append(u.getNickMostrar());
            params.append("&password=").append(u.getPasswordMd5());
            params.append("&email=").append(u.getEmail());

            locationBridgeVB.append(params);

            URL url = new URL(locationBridgeVB.toString());
            huc = (HttpURLConnection)url.openConnection();
            huc.setRequestMethod("GET");

            log.info("***************** params *****************");
            log.info(params.toString());
            log.info("***************** params *****************");

            huc.setDoOutput(true);
            huc.setDoInput(true);

            DataOutputStream wr = new DataOutputStream(huc.getOutputStream());
            wr.writeBytes(params.toString());
            wr.flush();
            wr.close();

            //Get Response
            InputStream is = huc.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuilder response = new StringBuilder();
            while((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            rd.close();

            log.info("************************** respuesta ******************");
            log.info(response.toString());
            log.info("************************** respuesta ******************");
        } catch (java.io.IOException ioe) {
            log.error("Error de IO: ", ioe);
        } catch (Exception e) {
            log.error("No se ha podido conectar al bridge de vbulletin", e);
        }

    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getTcontrasenya() {
        return tcontrasenya;
    }

    public void setTcontrasenya(String contrasenya) {
        this.tcontrasenya = contrasenya;
    }

    public String getRecordarme() {
        return recordarme;
    }

    public void setRecordarme(String recordarme) {
        this.recordarme = recordarme;
    }

    public String getR() {
        return r;
    }

    public void setR(String r) {
        this.r = r;
    }

    /*
    public String getPaginaRetorno() {
        return paginaRetorno;
    }

    public void setPaginaRetorno(String paginaRetorno) {
        this.paginaRetorno = paginaRetorno;
    }
     *
     */


    /*
    public static void main(String[] args) {
        s_llamarBridgeVBulletin();
    }


    private static void s_llamarBridgeVBulletin() {
        StringBuffer locationBridgeVB =
                new StringBuffer("http://forum.basketdudes.com/btnBridge_register.php");

        try {
            HttpURLConnection huc;
            StringBuffer params = new StringBuffer();
            params.append("?c=bt@vbulletin@10");
            params.append("&userid=2");
            params.append("&username=testing01");
            params.append("&password=202cb962ac59075b964b07152d234b70");
            params.append("&email=alberto@bitoon.com");

            locationBridgeVB.append(params);

            URL url = new URL(locationBridgeVB.toString());
            huc = (HttpURLConnection)url.openConnection();
            huc.setRequestMethod("GET");


            System.out.println("***************** params *****************");
            System.out.println(params.toString());
            System.out.println("***************** params *****************");

            huc.setDoOutput(true);
            huc.setDoInput(true);

            DataOutputStream wr = new DataOutputStream(huc.getOutputStream());
            wr.writeBytes(params.toString());
            wr.flush();
            wr.close();

            //Get Response
            InputStream is = huc.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuffer response = new StringBuffer();
            while((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            rd.close();

            System.out.println("************************** respuesta ******************");
            System.out.println(response.toString());
            System.out.println("************************** respuesta ******************");

        } catch (Exception e) {
            System.out.println("No se ha podido conectar al bridge de vbulletin" + e);
        }
    }
    */

}
